package com.airline;

import com.airline.entity.Flight;
import com.airline.entity.FlightStock; // 新增：导入余票实体类
import com.airline.entity.Order;
import com.airline.entity.User;
import com.airline.service.FlightService;
import com.airline.service.OrderService;
import com.airline.service.RefundService;
import com.airline.service.UserService;

import java.math.BigDecimal;
import java.util.List;
import java.util.Scanner;

public class Main {
    // 初始化所有服务层对象
    private static final UserService userService = new UserService();
    private static final FlightService flightService = new FlightService();
    private static final OrderService orderService = new OrderService();
    private static final RefundService refundService = new RefundService();
    private static final Scanner scanner = new Scanner(System.in);
    private static User currentUser = null; // 存储当前登录用户（未登录为null）

    public static void main(String[] args) {
        int choice;
        do {
            showMainMenu(); // 根据登录状态显示不同菜单
            choice = scanner.nextInt();
            scanner.nextLine(); // 消费换行符，避免输入异常

            // 根据登录状态处理不同分支
            if (currentUser == null) {
                // 未登录状态：仅显示登录、注册、退出
                switch (choice) {
                    case 1:
                        login(); // 登录
                        break;
                    case 2:
                        register(); // 注册
                        break;
                    case 0:
                        System.out.println("感谢使用，再见！");
                        break;
                    default:
                        System.out.println("无效选择，请重新输入！");
                }
            } else {
                // 已登录状态：显示所有功能
                switch (choice) {
                    case 1:
                        showAllFlights(); // 查看所有航班（含余票）
                        break;
                    case 2:
                        bookTicket(); // 订票（关联当前用户）
                        break;
                    case 3:
                        refundTicket(); // 退票（余票回退）
                        break;
                    case 4:
                        filterFlights(); // 航班筛选（含余票）
                        break;
                    case 5:
                        queryMyOrders(); // 查询个人订单
                        break;
                    case 6:
                        logout(); // 退出登录
                        break;
                    case 0:
                        System.out.println("感谢使用，再见！");
                        break;
                    default:
                        System.out.println("无效选择，请重新输入！");
                }
            }
        } while (choice != 0);
        scanner.close();
    }

    /**
     * 显示主菜单（根据登录状态动态切换）
     */
    private static void showMainMenu() {
        if (currentUser == null) {
            System.out.println("\n===== 航空订票系统（未登录） =====");
            System.out.println("1. 登录");
            System.out.println("2. 注册");
            System.out.println("0. 退出");
        } else {
            System.out.println("\n===== 航空订票系统（当前用户：" + currentUser.getRealName() + "） =====");
            System.out.println("1. 查看所有航班");
            System.out.println("2. 订票");
            System.out.println("3. 退票");
            System.out.println("4. 航班筛选");
            System.out.println("5. 查询个人订单");
            System.out.println("6. 退出登录");
            System.out.println("0. 退出系统");
        }
        System.out.print("请选择操作：");
    }

    /**
     * 登录功能
     */
    private static void login() {
        System.out.print("请输入用户名：");
        String username = scanner.nextLine().trim();
        System.out.print("请输入密码：");
        String password = scanner.nextLine().trim();

        User user = userService.login(username, password);
        if (user != null) {
            currentUser = user;
            System.out.println("登录成功！欢迎 " + user.getRealName() + " 使用系统～");
        } else {
            System.out.println("用户名或密码错误，登录失败！");
        }
    }

    /**
     * 注册功能
     */
    private static void register() {
        System.out.print("请输入用户名（至少4位）：");
        String username = scanner.nextLine().trim();
        System.out.print("请输入密码（至少6位）：");
        String password = scanner.nextLine().trim();
        System.out.print("请输入真实姓名（用于订票）：");
        String realName = scanner.nextLine().trim();

        if (userService.register(username, password, realName)) {
            System.out.println("注册成功！请返回登录界面登录。");
        } else {
            System.out.println("注册失败（用户名可能已存在或参数不合法）！");
        }
    }

    /**
     * 退出登录
     */
    private static void logout() {
        currentUser = null;
        System.out.println("退出登录成功！");
    }

    /**
     * 查看所有航班（含余票显示）
     */
    private static void showAllFlights() {
        System.out.println("\n===== 所有航班信息（含余票） =====");
        List<Flight> flights = flightService.getAllFlights();
        if (flights.isEmpty()) {
            System.out.println("暂无航班信息！");
            return;
        }
        for (Flight flight : flights) {
            // 查询该航班余票（需导入FlightStock类才能正常编译）
            FlightStock stock = flightService.getFlightStockByNo(flight.getFlightNo());
            int availableSeats = stock != null ? stock.getAvailableSeats() : 0;
            System.out.println("航班号：" + flight.getFlightNo() +
                    " | 出发地：" + flight.getDeparture() +
                    " | 目的地：" + flight.getDestination() +
                    " | 出发时间：" + flight.getDepartureTime() +
                    " | 到达时间：" + flight.getArrivalTime() +
                    " | 价格：" + flight.getPrice() +
                    " | 余票：" + availableSeats);
        }
    }

    /**
     * 订票功能（关联当前登录用户，含余票校验）
     */
    private static void bookTicket() {
        showAllFlights();
        System.out.print("请输入要预订的航班号：");
        String flightNo = scanner.nextLine().trim();

        // 调用订票方法（传入当前登录用户）
        if (orderService.bookTicket(flightNo, currentUser)) {
            System.out.println("订票成功！");
        } else {
            System.out.println("订票失败！");
        }
    }

    /**
     * 退票功能（优化输入校验，退票后余票回退）
     */
    private static void refundTicket() {
        System.out.print("请输入订单号：");
        String orderIdStr = scanner.nextLine().trim();
        int orderId;
        try {
            orderId = Integer.parseInt(orderIdStr);
        } catch (NumberFormatException e) {
            System.out.println("订单号必须为整数，请重新操作！");
            return;
        }

        if (refundService.refundTicket(orderId)) {
            System.out.println("退票成功！");
        } else {
            System.out.println("退票失败！");
        }
    }

    /**
     * 航班筛选功能（含余票显示）
     */
    private static void filterFlights() {
        System.out.print("请输入出发地（可选，直接回车跳过）：");
        String departure = scanner.nextLine().trim();
        System.out.print("请输入目的地（可选，直接回车跳过）：");
        String destination = scanner.nextLine().trim();

        BigDecimal minPrice = null;
        System.out.print("请输入最低价格（可选，直接回车跳过）：");
        String minPriceStr = scanner.nextLine().trim();
        if (!minPriceStr.isEmpty()) {
            try {
                minPrice = new BigDecimal(minPriceStr);
            } catch (NumberFormatException e) {
                System.out.println("价格格式错误，将忽略最低价格条件！");
            }
        }

        BigDecimal maxPrice = null;
        System.out.print("请输入最高价格（可选，直接回车跳过）：");
        String maxPriceStr = scanner.nextLine().trim();
        if (!maxPriceStr.isEmpty()) {
            try {
                maxPrice = new BigDecimal(maxPriceStr);
            } catch (NumberFormatException e) {
                System.out.println("价格格式错误，将忽略最高价格条件！");
            }
        }

        // 调用筛选方法
        List<Flight> flights = flightService.findFlightsByCondition(
                departure.isEmpty() ? null : departure,
                destination.isEmpty() ? null : destination,
                minPrice,
                maxPrice
        );

        System.out.println("\n===== 筛选结果（含余票） =====");
        if (flights.isEmpty()) {
            System.out.println("未找到符合条件的航班！");
            return;
        }
        for (Flight flight : flights) {
            FlightStock stock = flightService.getFlightStockByNo(flight.getFlightNo());
            int availableSeats = stock != null ? stock.getAvailableSeats() : 0;
            System.out.println("航班号：" + flight.getFlightNo() +
                    " | 出发地：" + flight.getDeparture() +
                    " | 目的地：" + flight.getDestination() +
                    " | 价格：" + flight.getPrice() +
                    " | 余票：" + availableSeats);
        }
    }

    /**
     * 查询个人订单（仅显示当前登录用户的订单）
     */
    private static void queryMyOrders() {
        String userName = currentUser.getRealName();
        List<Order> orders = orderService.getOrdersByUserName(userName);
        if (orders.isEmpty()) {
            System.out.println("您暂无订单！");
            return;
        }
        System.out.println("\n===== 您的个人订单 =====");
        for (Order order : orders) {
            System.out.println("订单号：" + order.getId() +
                    " | 航班号：" + order.getFlightNo() +
                    " | 订票时间：" + order.getBookTime() +
                    " | 乘客：" + order.getUserName());
        }
    }
}